//
// Created by martin on 1/28/22.
//

#ifndef MYMUDUO_THREAD_H
#define MYMUDUO_THREAD_H

#include "muduo/base/noncopyable.h"
#include "muduo/base/Types.h"
#include "muduo/base/CountDownLatch.h"
#include "muduo/base/Atomic.h"

#include <pthread.h>
#include <functional>

namespace muduo
{

class Thread : noncopyable
{
public:
    typedef std::function<void()> ThreadFunc;

    explicit Thread(ThreadFunc, const string& nameArg = string());
    ~Thread();

    void start();
    int join();

    bool started() const { return started_; }

    pthread_t pthreadId() const { return pthreadId_; }
    pid_t tid() const { return tid_; }
    const string& name() const { return name_; }

    static int numCreated() { return numCreated_.get(); }

private:
    void setDefaultName();

    bool started_;
    bool joined_;
    pthread_t pthreadId_;
    pid_t tid_;
    ThreadFunc func_;
    string name_;
    CountDownLatch latch_;

    static AtomicInt32 numCreated_;
};

} // namespace muduo




#endif //MYMUDUO_THREAD_H
